home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 August / macformat-027.iso / mac / Shareware City / Developers / Oberon⁄F / Form / Mod / Views (.txt) < prev   
Encoding:
Oberon Document  |  1994-06-07  |  10.8 KB  |  334 lines  |  [oODC/obnF]

  1. Documents.StdDocumentDesc
  2. Documents.DocumentDesc
  3. Containers.ViewDesc
  4. Views.ViewDesc
  5. Stores.StoreDesc
  6. Documents.ModelDesc
  7. Containers.ModelDesc
  8. Models.ModelDesc
  9. Stores.ElemDesc
  10. TextViews.StdViewDesc
  11. TextViews.ViewDesc
  12. TextModels.StdModelDesc
  13. TextModels.ModelDesc
  14. TextModels.AttributesDesc
  15. Geneva
  16. Geneva
  17. Geneva
  18. MODULE FormViews;
  19. (* OmInc 
  20.     IMPORT
  21.         Domains, Ports, Stores, Models, Views, Controllers, Properties, Dialog, Containers,
  22.         FormModels;
  23.     CONST
  24.         (** minimal border between form view and any embedded view: **)
  25.         minBorder* = 4 * Ports.point; maxBorder* = 100 * Ports.mm;
  26.         maxSize = 600 * Ports.mm;
  27.         (* range of currently supported versions *)
  28.         minVersion = 0; maxBaseVersion = 0; maxStdVersion = 0;
  29.     TYPE
  30.         View* = POINTER TO ViewDesc;
  31.         ViewDesc* = RECORD (Containers.ViewDesc)
  32.             border-: LONGINT;
  33.             grid-: LONGINT;    (** grid > 0 **)
  34.             gridFactor-: INTEGER;    (** gridFactor > 0 **)
  35.             showGrid-: BOOLEAN    (** temporary, preset to FALSE **)
  36.         END;
  37.         Directory* = POINTER TO DirectoryDesc;
  38.         DirectoryDesc* = RECORD END;
  39.         StdView = POINTER TO StdViewDesc;
  40.         StdViewDesc = RECORD (ViewDesc)
  41.             cache: FormModels.Reader    (* reuse form reader *)
  42.         END;
  43.         StdDirectory = POINTER TO StdDirectoryDesc;
  44.         StdDirectoryDesc = RECORD (DirectoryDesc) END;
  45.         ViewOp = POINTER TO ViewOpDesc;
  46.         ViewOpDesc = RECORD (Domains.OperationDesc)
  47.             view: View;    (* view # NIL *)
  48.             border: LONGINT;    (* border >= minBorder *)
  49.             grid: LONGINT;    (* grid > 0 *)
  50.             gridFactor: INTEGER    (* gridFactor > 0 *)
  51.         END;
  52.         dir-, stdDir-: Directory;
  53.         ctrldir-: Containers.Directory;
  54.     (** View **)
  55.     PROCEDURE (v: View) Clone* (): View;
  56.         VAR s: Stores.Store;
  57.     BEGIN
  58.         s := Stores.Clone(v); RETURN s(View)
  59.     END Clone;
  60.     PROCEDURE (v: View) Internalize* (VAR rd: Stores.Reader);
  61.         VAR thisVersion: SHORTINT;
  62.     BEGIN
  63.         v.Internalize^(rd);
  64.         IF rd.cancelled THEN RETURN END;
  65.         rd.ReadVersion(minVersion, maxBaseVersion, thisVersion);
  66.         IF rd.cancelled THEN RETURN END;
  67.         rd.ReadLInt(v.border);
  68.         rd.ReadLInt(v.grid);
  69.         rd.ReadInt(v.gridFactor)
  70.     END Internalize;
  71.     PROCEDURE (v: View) Externalize* (VAR wr: Stores.Writer);
  72.     BEGIN
  73.         v.Externalize^(wr);
  74.         wr.WriteVersion(maxBaseVersion);
  75.         wr.WriteLInt(v.border);
  76.         wr.WriteLInt(v.grid);
  77.         wr.WriteInt(v.gridFactor)
  78.     END Externalize;
  79.     PROCEDURE (v: View) CopyFrom* (source: Views.View);
  80.     BEGIN
  81.         v.CopyFrom^(source);
  82.         WITH source: View DO
  83.             v.border := source.border;
  84.             v.grid := source.grid;
  85.             v.gridFactor := source.gridFactor;
  86.             v.showGrid := source.showGrid
  87.         END
  88.     END CopyFrom;
  89.     PROCEDURE (v: View) InitModel* (model: Containers.Model);
  90.     (** covariant model **)
  91.     BEGIN
  92.         v.InitModel^(model); ASSERT(model IS FormModels.Model, 23)
  93.     END InitModel;
  94.     PROCEDURE (v: View) ThisModel* (): FormModels.Model;
  95.     (** covariant model **)
  96.         VAR m: Containers.Model;
  97.     BEGIN
  98.         m := v.ThisModel^();
  99.         IF m # NIL THEN RETURN m(FormModels.Model) ELSE RETURN NIL END
  100.     END ThisModel;
  101.     PROCEDURE (v: View) GetRect* (f: Views.Frame; view: Views.View; VAR l, t, r, b: LONGINT);
  102.     BEGIN
  103.         FormModels.GetRect(view, l, t, r, b)
  104.     END GetRect;
  105.     PROCEDURE (v: View) SetBorder* (border: LONGINT);
  106.     (** border >= 0    20 **)
  107.         VAR op: ViewOp;
  108.     BEGIN
  109.         ASSERT(border >= 0, 20);
  110.         IF border < minBorder THEN
  111.             border := minBorder
  112.         ELSIF border > maxBorder THEN
  113.             border := maxBorder
  114.         END;
  115.         NEW(op); op.view := v; op.border := border;
  116.         op.grid := v.grid; op.gridFactor := v.gridFactor;
  117.         Views.Do(v, "#Form:BorderChange", op)
  118.     END SetBorder;
  119.     PROCEDURE (v: View) SetGrid* (grid: LONGINT; gridFactor: INTEGER);
  120.         grid > 0    20
  121.         gridFactor > 0    21
  122.         VAR op: ViewOp;
  123.     BEGIN
  124.         ASSERT(grid > 0, 20); ASSERT(gridFactor > 0, 21);
  125.         NEW(op); op.view := v; op.border := v.border;
  126.         op.grid := grid; op.gridFactor := gridFactor;
  127.         Views.Do(v, "#Form:GridChange", op)
  128.     END SetGrid;
  129.     PROCEDURE (v: View) ShowGrid* (showGrid: BOOLEAN);
  130.     BEGIN
  131.         IF showGrid # v.showGrid THEN
  132.             v.showGrid := showGrid;
  133.             Views.Update(v, Views.keepFrames)
  134.         END
  135.     END ShowGrid;
  136.     (** Directory **)
  137.     PROCEDURE (d: Directory) New* (f: FormModels.Model): View;
  138.         f # NIL    20
  139.         f.init    21
  140.     BEGIN
  141.         HALT(127)
  142.     END New;
  143.     (* ViewOp *)
  144.     PROCEDURE (op: ViewOp) Do;
  145.         VAR border, grid: LONGINT; gridFactor: INTEGER;
  146.     BEGIN
  147.         (* save old state of view *)
  148.         border := op.view.border; grid := op.view.grid; gridFactor := op.view.gridFactor;
  149.         (* set new state of view *)
  150.         op.view.border := op.border; op.view.grid := op.grid; op.view.gridFactor := op.gridFactor;
  151.         Views.Update(op.view, Views.keepFrames);
  152.         (* old state is new undo state *)
  153.         op.border := border; op.grid := grid; op.gridFactor := gridFactor
  154.     END Do;
  155.     (* StdView *)
  156.     PROCEDURE (v: StdView) Internalize (VAR rd: Stores.Reader);
  157.         VAR thisVersion: SHORTINT;
  158.     BEGIN
  159.         v.Internalize^(rd);
  160.         IF rd.cancelled THEN RETURN END;
  161.         rd.ReadVersion(minVersion, maxStdVersion, thisVersion)
  162.     END Internalize;
  163.     PROCEDURE (v: StdView) Externalize (VAR wr: Stores.Writer);
  164.     BEGIN
  165.         v.Externalize^(wr);
  166.         wr.WriteVersion(maxStdVersion)
  167.     END Externalize;
  168.     PROCEDURE (v: StdView) Background (): Ports.Color;
  169.     BEGIN
  170.         RETURN Dialog.background
  171.     END Background;
  172.     PROCEDURE (v: StdView) Restore (f: Views.Frame; l, t, r, b: LONGINT);
  173.         VAR form: FormModels.Model; ctrl: Containers.Controller;
  174.             focus, q: Views.View; k, w, h, x, y: LONGINT; s: FormModels.Reader;
  175.     BEGIN
  176.         form := v.ThisModel();
  177.         IF form # NIL THEN
  178.             ctrl := v.ThisController();
  179.             IF ctrl # NIL THEN focus := ctrl.ThisFocus() ELSE focus := NIL END;
  180.             s := form.NewReader(v.cache); v.cache := s;
  181.             s.Set(NIL); s.ReadView(q); k := 0;
  182.             WHILE q # NIL DO
  183.                 IF (s.r >= l) & (s.b >= t) & (s.l < r) & (s.t < b) THEN
  184.                     Views.InstallFrame(f, q, s.l, s.t, k, q = focus)
  185.                 END;
  186.                 s.ReadView(q); INC(k)
  187.             END
  188.         ELSE
  189.             f.DrawRect(l, t, r, b, Ports.fill, Ports.grey12)
  190.         END;
  191.         IF v.showGrid THEN
  192.             k := v.grid * v.gridFactor; ASSERT(k > 0, 100);
  193.             v.context.GetSize(w, h);
  194.             IF w > maxSize THEN w := maxSize END;
  195.             IF h > maxSize THEN h := maxSize END;
  196.             x := l - l MOD k;
  197.             WHILE x <= w DO
  198.                 f.MarkRect(x, 0, x + f.unit, h, Ports.fill, Ports.dim50, Ports.show);
  199.                 INC(x, k)
  200.             END;
  201.             y := t - t MOD k;
  202.             WHILE y <= h DO
  203.                 f.MarkRect(0, y, w, y + f.unit, Ports.fill, Ports.dim50, Ports.show);
  204.                 INC(y, k)
  205.             END
  206.         END
  207.     END Restore;
  208.     PROCEDURE (v: StdView) HandleModelMsg (VAR msg: Models.Message);
  209.     BEGIN
  210.         v.HandleModelMsg^(msg);
  211.         WITH msg: Models.UpdateMsg DO
  212.             WITH msg: FormModels.UpdateMsg DO
  213.                 Views.UpdateIn(v, msg.l, msg.t, msg.r, msg.b, Views.rebuildFrames)
  214.             ELSE
  215.                 Views.Update(v, Views.rebuildFrames)    (* catch all update messages *)
  216.             END
  217.         ELSE
  218.         END
  219.     END HandleModelMsg;
  220.     PROCEDURE GetBounds (v: StdView; VAR w, h: LONGINT);
  221.         VAR form: FormModels.Model; r, b: LONGINT; p: FormModels.Reader; q: Views.View;
  222.     BEGIN
  223.         form := v.ThisModel();
  224.         IF form # NIL THEN
  225.             p := form.NewReader(v.cache); v.cache := p;
  226.             p.Set(NIL);    (* set reader to bottom of view list *)
  227.             p.ReadView(q);    (* read bottom-most view *)
  228.             IF q # NIL THEN
  229.                 r := 0; b := 0;
  230.                 WHILE q # NIL DO
  231.                     IF p.r > r THEN r := p.r END;
  232.                     IF p.b > b THEN b := p.b END;
  233.                     p.ReadView(q)
  234.                 END;
  235.                 w := r + v.border; h := b + v.border
  236.             END
  237.         END
  238.     END GetBounds;
  239.     PROCEDURE AssertRange (border: LONGINT; VAR w, h: LONGINT);
  240.         VAR min: LONGINT;
  241.     BEGIN    (* prevent illegal values *)
  242.         min := 2 * border + FormModels.minViewSize;
  243.         IF w = Views.undefined THEN w := 100 * Ports.mm
  244.         ELSIF w < min THEN w := min
  245.         ELSIF w > maxSize THEN w := maxSize
  246.         END;
  247.         IF h = Views.undefined THEN h := 70 * Ports.mm
  248.         ELSIF h < min THEN h := min
  249.         ELSIF h > maxSize THEN h := maxSize
  250.         END
  251.     END AssertRange;
  252.     PROCEDURE (v: StdView) HandlePropMsg (VAR p: Properties.Message);
  253.     BEGIN
  254.         v.HandlePropMsg^(p);
  255.         WITH p: Properties.BoundsPref DO
  256.             GetBounds(v, p.w, p.h)
  257.         | p: Properties.SizePref DO
  258.             AssertRange(v.border, p.w, p.h)
  259.         ELSE
  260.         END
  261.     END HandlePropMsg;
  262.     (* StdDirectory *)
  263.     PROCEDURE (d: StdDirectory) New (f: FormModels.Model): View;
  264.         VAR v: StdView; grid: LONGINT; gridFactor: INTEGER;
  265.     BEGIN
  266.         ASSERT(f # NIL, 20); ASSERT(f.init, 21);
  267.         NEW(v); v.InitModel(f);
  268.         IF ctrldir # NIL THEN v.SetController(ctrldir.New()) END;
  269.         v.SetBorder(minBorder);
  270.         IF Dialog.metricSystem THEN
  271.             grid := Ports.mm; gridFactor := 10    (* place at 1mm resolution *)
  272.         ELSE
  273.             grid := Ports.inch DIV 20; gridFactor := 20    (* place at 1.27mm resolution *)
  274.         END;
  275.         v.SetGrid(grid, gridFactor);
  276.         v.ShowGrid(TRUE);
  277.         v.Init;
  278.         RETURN v
  279.     END New;
  280.     (** miscellaneous **)
  281.     PROCEDURE Focus* (): View;
  282.         VAR v: Views.View;
  283.     BEGIN
  284.         v := Controllers.FocusView();
  285.         IF (v # NIL) & (v IS View) THEN RETURN v(View) ELSE RETURN NIL END
  286.     END Focus;
  287.     PROCEDURE FocusModel* (): FormModels.Model;
  288.         VAR v: View;
  289.     BEGIN
  290.         v := Focus();
  291.         IF v # NIL THEN RETURN v.ThisModel() ELSE RETURN NIL END
  292.     END FocusModel;
  293.     PROCEDURE RoundToGrid* (v: View; VAR x, y: LONGINT);
  294.         VAR grid: LONGINT;
  295.     BEGIN
  296.         grid := v.grid;
  297.         x := x + grid DIV 2;
  298.         y := y + grid DIV 2;
  299.         x := x - x MOD grid;
  300.         y := y - y MOD grid
  301.     END RoundToGrid;
  302.     PROCEDURE Deposit*;
  303.     BEGIN
  304.         Views.Deposit(dir.New(FormModels.dir.New()))
  305.     END Deposit;
  306.     PROCEDURE SetDir* (d: Directory);
  307.     BEGIN
  308.         ASSERT(d # NIL, 20); dir := d
  309.     END SetDir;
  310.     PROCEDURE SetCtrlDir* (d: Containers.Directory);
  311.     BEGIN
  312.         ASSERT(d # NIL, 20); ctrldir := d
  313.     END SetCtrlDir;
  314.     PROCEDURE Init;
  315.         VAR d: StdDirectory; res: LONGINT;
  316.     BEGIN
  317.         Dialog.Call("FormControllers.Install", "#Form:CntrlInstallFailed", res);
  318.         NEW(d); dir := d; stdDir := d
  319.     END Init;
  320. BEGIN
  321.     Init
  322. END FormViews.
  323. TextControllers.StdCtrlDesc
  324. TextControllers.ControllerDesc
  325. Containers.ControllerDesc
  326. Controllers.ControllerDesc
  327. TextRulers.StdRulerDesc
  328. TextRulers.RulerDesc
  329. TextRulers.StdStyleDesc
  330. TextRulers.StyleDesc
  331. TextRulers.AttributesDesc
  332. Geneva
  333. Documents.ControllerDesc
  334.